package Teste;

import java.util.LinkedList;



import puzzle.Puzzle;
import respuzzle.EstadoPuzzle;
import respuzzle.ObjectivoPuzzle;
import respuzzle.OperadorMover;
import mecproc.*;


public class TestePuzzle {
	
	enum tipoProc {Prof, ProfLimt, ProfIter, Larg, Cust, AA, Sofr}
	
	public static void main(String[] args) throws Exception{
		
		//----------------------
		//----Tabuleiros 3x3----
		//----------------------
		
		//int[][] tab1={{2,3,6}, {1,0,5}, {4,7,8}};
		//int[][] tab1={{1,2,3},{8,4,5},{6,7,0}};
		int[][] tab1={{8,4,5},{6,1,2},{3,7,0}};
		
		int[][] tabFinal={{1,2,3},{4,5,6},{7,8,0}};
		//----------------------
		//----Tabuleiros 4x4----
		//----------------------
		//int[][] tab1={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,0,15}};
		//int[][] tab1={{8,4,5,9},{10,6,1,2},{3,11,7,12},{13,14,0,15}};
		
		//int[][] tabFinal={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};
		
		
		Puzzle puzzleInicial = new Puzzle(tab1);
		Puzzle puzzleFinal = new Puzzle(tabFinal);
		
		//MecProcura<EstadoPuzzle> mecProcura = new MecProcProf<EstadoPuzzle>();
		//MecProcura<EstadoPuzzle> mecProcura = new MecProcProfLimit<EstadoPuzzle>(1400);
		//MecProcura<EstadoPuzzle> mecProcura = new MecProcProfIter<EstadoPuzzle>(7,1);
		
		//MecProcura<EstadoPuzzle> mecProcura = new MecProcLarg<EstadoPuzzle>();
		//MecProcura<EstadoPuzzle> mecProcura = new MecProcCustoUnif<EstadoPuzzle>();
		
		//MecProcura<EstadoPuzzle> mecProcura = new MecProcAA<EstadoPuzzle>();
		MecProcura<EstadoPuzzle> mecProcura = new MecProcSofrega<EstadoPuzzle>();
		
		EstadoPuzzle estadoInicial = new EstadoPuzzle(puzzleInicial);
		ObjectivoPuzzle objectivo = new ObjectivoPuzzle(new EstadoPuzzle(puzzleFinal));
		
		OperadorMover[] operadores = {
				new OperadorMover(Puzzle.Movimento.BAIXO),
				new OperadorMover(Puzzle.Movimento.CIMA),
				new OperadorMover(Puzzle.Movimento.DIR),
				new OperadorMover(Puzzle.Movimento.ESQ)};
		
		LinkedList<No<EstadoPuzzle>> solucao = mecProcura.procurar(estadoInicial, objectivo, operadores);

		//mostrar solucao
		if(solucao != null) {
			System.out.println("Movimentos:");
			for(No<EstadoPuzzle> no : solucao)
					System.out.println(no.getEstado().toString());
		}
		else
			System.out.println("Solucao nao encontrada");
		
		
	}
	private LinkedList<No<EstadoPuzzle>> execute(Puzzle puzzleInicial, Puzzle puzzleFinal, tipoProc tipo){
		return null;
	}
}


